package com.fy.tt.service.impl;

import com.fy.sqlparam.impl.SqlParameter;
import com.fy.sqlparam.impl.SqlParameter.Query;
import com.fy.sqlparam.param.ISqlParameter;
import com.fy.sqlparam.param.ISqlQuery;
import com.fy.toolhelper.db.IBaseDao;
import com.fy.tt.action.TemplateTool;
import com.fy.tt.dao.ITemplateDao;
import com.fy.tt.entity.TemplateEntity;
import com.fy.tt.service.ITemplateService;

import java.sql.Connection;
import java.util.List;

public class TemplateServiceImpl implements ITemplateService {

    @Override
    public void doSomeBussiness() throws Exception {
        final Connection connection = TemplateTool.getDBConnection();
        TemplateTool.startTransaction();
        // 此调用获取数据库连接获取不到就会报错, 如果不希望报错请使用ActionTool.getNullableDBConnection()
        ITemplateDao templateDao = TemplateTool.getBean(ITemplateDao.class);
        templateDao.save(connection, new TemplateEntity());
        templateDao.update(connection, new TemplateEntity());
        templateDao.delete(connection, new TemplateEntity());
        // SQL动态查询参数实例
        ISqlParameter parameter = new SqlParameter();
        ISqlQuery query = parameter.query(Query.to("id").eq(111)
                .or(Query.to("id").eq(222)));
        if (true || false) {
            query.and(Query.to("id").eq(333)); /* 注意其保留了条件判断可断开的能力 */
        }
        // 等同于: 其它查询条件 AND (id = 444 OR id = 555), 注意有括号的
        query.and(Query.to("id").eq(444).or(Query.to("id").eq(555)));
        // 其它
//		parameter.markOrderBy("id", false); /* 可以多个, 按调用顺序排列 */
//		parameter.setPagination(page, count, offset)
//		parameter.deleteConditions();
//		parameter.deletePagination();
//		parameter.deleteQuery(query);
        List<TemplateEntity> entities = templateDao.listByParameter(connection, parameter);
        if (entities.isEmpty()) { /* 不会为null的 */
            return;
        }
        templateDao.extend(connection, entities,
                new String[]{"extendAlias" /* 和DaoImpl构造器配置的@Extend的name一致*/},
                new IBaseDao<?>[]{TemplateTool.getBean(ITemplateDao.class)} /* 能够查询出目标实体的Dao的实例 */);
        // ... 其它业务代码

        // 工具的业务异常
//		if(true) {
//			throw new ToolException("调试信息, 建议把相关变量的值输出", "用户查看的信息, 可选");
//		}
		
		/* 最后的事务提交, 如果上面的代码抛了异常, 会自动调用TemplateTool.rollBackTransactionIfUsed回滚事务
		 所以不用自己处理了 */
        TemplateTool.commitTransactionIfNeed();
    }
}
